既然要做IOT玩具,當然要能上網,然後用手機控制玩具~
接下來的Note 3和Note 4,來試著用手機控制LED燈。
*題外話: 如果是用Arduino的話,就可以用美美的Blynk APP了,且號稱5分鐘可透過手機控制板子LED。Amebaz2似乎也有Arduino SDK,但我沒有裝過。目前不裝Arduino,先用最古老的方法...
要是每一次開機都要手動設定wifi上網,就太麻煩了,所以要把wifi資訊存進firmware裡。
首先開啟這個檔案 component/common/example/wlan_fast_connect/example_wlan_fast_connect.c
找到以下function(此function在boot的過程中會執行到,所以直接改這邊最快)。
int wlan_init_done_callback(void)
{
// ...
// 中間略
// ...
data = (struct wlan_fast_reconnect *)malloc(sizeof(struct wlan_fast_reconnect));
if(data){
device_mutex_lock(RT_DEV_LOCK_FLASH);
// wlan fast reconnect資訊是存在FAST_RECONNECT_DATA裡面,而這個變數是一塊在flash offset(0x200000 - 0x1000)的空間
flash_stream_read(&flash, FAST_RECONNECT_DATA, sizeof(struct wlan_fast_reconnect), (uint8_t *)data);
device_mutex_unlock(RT_DEV_LOCK_FLASH);
正常情況下,FAST_RECONNECT_DATA裡面是沒有東西的,所以正解就是,在build firmware時先做一個struct wlan_fast_reconnect物件,把它一起包進firmware binary中。燒完firmware重開機之後,物件就會存在flash中了。
但這個方法有點麻煩,必須要去trace build firmware的code,有點懶惰.......
所以決定先用一個偷吃步就好(看看就好不要學,可能會有不預期的bug)。
// 一樣在wlan_init_done_callback(void)這個function
// 既然data物件讀出來是空的,那我只好塞值給他了,而且只塞必要的值
printf("[HANA] set config - wlan fast connect - start\n");
// 家裡AP的SSID
strcpy(data->psk_essid, "HANA_HOME_WIFI");
// 家裡AP的密碼(直接明碼很危險,不過先這樣)
strcpy(data->psk_passphrase, "12345678");
// 參考家裡AP的加密方法
data->security_type = RTW_SECURITY_WPA2_AES_PSK;
// 先建立一個全域變數static u8 pscan_channel_list[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14};
// 代表要掃描所有的channel
data->channel = &pscan_channel_list;
printf("[HANA] set config - wlan fast connect - end\n");
// 因為我們只有指定data物件一部分的值而已,其他沒用到的地方需要註解掉,以免crash,例如
// offer_ip = data->offer_ip;
// wifi_connect()是連接wifi上網的主要function,所以只要把wifi物件搞定就好
// 而wifi物件又是從data來的,所以改data物件是可行的
ret = wifi_connect((char*)wifi.ssid.val, wifi.security_type, (char*)wifi.password, wifi.ssid.len,
wifi.password_len, wifi.key_id, NULL);
燒完firmware重開機,就會看到UART log印出以下文字,代表要到IP囉!!!
Interface 0 IP address : 192.168.1.105